from device_manager import DeviceManager
from pulsar import Client, AuthenticationToken
from env import TOKEN, SENSOR_TOPIC, CONTROL_TOPIC
import json
import time
import signal
import sys

class DeviceManagerProcess:
    def __init__(self):
        self.device_manager = DeviceManager()
        self.running = True

        service_url = "pulsar+ssl://pulsar.cloud.unitestream.com:6651"\
        
        # Pulsar 配置：指定 Pulsar 服务的连接地址和相关主题名称。
        self.pulsar_service_url = "pulsar://localhost:6650"
        self.sensor_topic = SENSOR_TOPIC  # 传感器数据主题，用于接收传感器上报的数据
        self.control_topic = CONTROL_TOPIC  # 控制主题，用于发送设备控制指令
        
        # 初始化 Pulsar 客户端，使用 Token 进行身份认证，连接到指定的服务地址。
        self.client = Client(service_url, authentication=AuthenticationToken(TOKEN))
        
        # 创建用于接收传感器数据的消费者。订阅 sensor_topic，指定订阅名称和消费者属性。
        self.sensor_consumer = self.client.subscribe(
            self.sensor_topic,
            "device-manager-subscription",
            properties={
                "consumer-name": "device-manager-consumer",  # 消费者名称
                "consumer-id": "device-manager-consumer-id"  # 消费者唯一标识
            }
        )
        
        # 创建用于发送设备控制指令的生产者，发送到 control_topic。
        self.control_producer = self.client.create_producer(self.control_topic)
    
    def process_sensor_data(self):
        """
        处理传感器数据并更新设备状态。
        该方法会持续监听传感器数据主题，接收到数据后解析内容，
        更新设备管理器中的传感器状态，并将当前设备状态通过控制主题发送出去。
        """
        ############################### LAB2 ############################

        ########################################################
    
    def cleanup(self):
        """
        资源清理方法。
        关闭消费者、生产者和客户端，确保进程退出时资源被正确释放。
        """
        print("正在清理 DeviceManager 进程资源...")
        self.running = False
        
        if self.sensor_consumer:
            try:
                self.sensor_consumer.close()  # 关闭消费者
            except:
                pass
        
        if self.control_producer:
            try:
                self.control_producer.close()  # 关闭生产者
            except:
                pass
        
        if self.client:
            try:
                self.client.close()  # 关闭 Pulsar 客户端
            except:
                pass
        
        print("DeviceManager 进程资源清理完成")

# 信号处理函数，用于优雅地关闭进程。
def signal_handler(signum, frame):
    """
    处理退出信号（如 Ctrl+C 或 kill），确保资源被正确释放。
    """
    print("DeviceManager 进程收到退出信号")
    device_manager_process.cleanup()
    sys.exit(0)

if __name__ == '__main__':
    # 创建 DeviceManager 进程实例
    device_manager_process = DeviceManagerProcess()
    
    # 注册信号处理函数，捕获 SIGINT（Ctrl+C）和 SIGTERM（kill）信号
    signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)
    
    # 启动传感器数据处理主循环
    device_manager_process.process_sensor_data() 